package com.ruoyi.common.constant;

import java.util.Locale;

import io.jsonwebtoken.Claims;

/**
 * 通用常量信息
 * <p>
 * 该类定义了系统中使用的各种全局常量，包括字符集、请求协议、权限标识、JWT相关字段、
 * 远程调用前缀以及安全白名单等配置项。
 *
 * @author ruoyi
 */
public class Constants {
    /**
     * UTF-8 字符集编码名称
     */
    public static final String UTF8 = "UTF-8";

    /**
     * GBK 字符集编码名称
     */
    public static final String GBK = "GBK";

    /**
     * 系统默认语言环境，设置为简体中文
     */
    public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE;

    /**
     * www主域名前缀字符串
     */
    public static final String WWW = "www.";

    /**
     * HTTP协议前缀
     */
    public static final String HTTP = "http://";

    /**
     * HTTPS协议前缀
     */
    public static final String HTTPS = "https://";

    /**
     * 表示操作成功的通用状态码
     */
    public static final String SUCCESS = "0";

    /**
     * 表示操作失败的通用状态码
     */
    public static final String FAIL = "1";

    /**
     * 登录成功时的状态标识
     */
    public static final String LOGIN_SUCCESS = "Success";

    /**
     * 用户注销操作标识
     */
    public static final String LOGOUT = "Logout";

    /**
     * 用户注册操作标识
     */
    public static final String REGISTER = "Register";

    /**
     * 登录失败时的状态标识
     */
    public static final String LOGIN_FAIL = "Error";

    /**
     * 表示拥有所有权限的通配符标识（格式：*:*:*）
     */
    public static final String ALL_PERMISSION = "*:*:*";

    /**
     * 管理员角色的权限标识
     */
    public static final String SUPER_ADMIN = "admin";

    /**
     * 多个角色之间的分隔符
     */
    public static final String ROLE_DELIMETER = ",";

    /**
     * 多个权限标识之间的分隔符
     */
    public static final String PERMISSION_DELIMETER = ",";

    /**
     * 验证码的有效时间（单位：分钟）
     */
    public static final Integer CAPTCHA_EXPIRATION = 2;

    /**
     * 用于表示令牌的键名
     */
    public static final String TOKEN = "token";

    /**
     * JWT令牌的标准前缀
     */
    public static final String TOKEN_PREFIX = "Bearer ";

    /**
     * 登录用户信息在缓存中的键名
     */
    public static final String LOGIN_USER_KEY = "login_user_key";

    /**
     * JWT载荷中用户ID字段的键名
     */
    public static final String JWT_USERID = "userid";

    /**
     * JWT载荷中用户名字段的键名（使用标准Claims.SUBJECT）
     */
    public static final String JWT_USERNAME = Claims.SUBJECT;

    /**
     * JWT载荷中用户头像URL字段的键名
     */
    public static final String JWT_AVATAR = "avatar";

    /**
     * JWT载荷中创建时间字段的键名
     */
    public static final String JWT_CREATED = "created";

    /**
     * JWT载荷中用户权限列表字段的键名
     */
    public static final String JWT_AUTHORITIES = "authorities";

    /**
     * 资源文件映射路径的前缀
     */
    public static final String RESOURCE_PREFIX = "/profile";

    /**
     * RMI远程方法调用的协议前缀
     */
    public static final String LOOKUP_RMI = "rmi:";

    /**
     * LDAP远程方法调用的协议前缀
     */
    public static final String LOOKUP_LDAP = "ldap:";

    /**
     * LDAPS远程方法调用的协议前缀（安全连接）
     */
    public static final String LOOKUP_LDAPS = "ldaps:";

    /**
     * 允许自动识别并解析的JSON对象包名白名单（范围越小越安全）
     */
    public static final String[] JSON_WHITELIST_STR = {"com.ruoyi"};

    /**
     * 定时任务允许访问的类所在的包名白名单
     */
    public static final String[] JOB_WHITELIST_STR = {"com.ruoyi.quartz.task"};

    /**
     * 定时任务中禁止使用的危险类或包名（防止恶意代码执行）
     */
    public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
            "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator"};
}
